'''
12. 带最小值操作的栈
实现一个带有取最小值min方法的栈，min方法将返回当前栈中的最小值。

你实现的栈将支持push，pop 和 min 操作，所有操作要求都在O(1)时间内完成。

样例
如下操作：push(1)，pop()，push(2)，push(3)，min()， push(1)，min() 返回 1，2，1

注意事项
如果堆栈中没有数字则不能进行min方法的调用
'''

'''
解题思路，使用两个栈来保存数据，self.stack保存正常数据，self.minstack记录self.stack当前
状态的最小值。
'''
class MinStack:
    
    def __init__(self):
        # do intialization if necessary
        self.minstack = []
        self.stack = []
        self.__min = None
    """
    @param: number: An integer
    @return: nothing
    """
    def push(self, number):
        # write your code here
        if not self.__min or self.__min > number:
            self.__min = number
        self.minstack.append(self.__min)
        self.stack.append(number)
        
    """
    @return: An integer
    """
    def pop(self):
        # write your code here
        self.minstack.pop()
        if len(self.minstack) > 0:
            self.__min = self.minstack[-1]
        else:
            self.__min = None
        return self.stack.pop()
    """
    @return: An integer
    """
    def min(self):
        # write your code here
        if len(self.minstack) > 0:
            return self.minstack[-1]
        else:
            return None
